<TagAttribute("actor_variant","actv","????","????",1,568)>
Public Class ACTOR_VARIANT_TAG
Inherits HaloTag
Public Const Extension as String = "actor_variant"
Public Const FourCC as String = "actv"
Public Const ParentFourCC as String = "????"
Public Const GrandParentFourCC as String = "????"
Public Const [Version] as Short = 1
Public Const HeaderLength as Integer = 568

''' <summary>
''' 
''' </summary>
<TagField("flags", 1, 20)>
Public flags as Integer

''' <summary>
''' 
''' </summary>
<TagField("actor definition", 16, 10)>
Public actor_definition as New TAG_REFERENCE

''' <summary>
''' 
''' </summary>
<TagField("unit", 16, 10)>
Public unit as New TAG_REFERENCE

''' <summary>
''' 
''' </summary>
<TagField("major variant", 16, 10)>
Public major_variant as New TAG_REFERENCE

''' <summary>
''' 
''' </summary>
<TagField("", 24, -1)>
Public padding as Byte()

''' <summary>
''' note: only the flood combat forms will ever try to switch movement types voluntarily during combat
''' </summary>
#Region "movement switching"

''' <summary>
''' when we have a choice of movement types, which type we will use
''' </summary>
<TagField("movement type", 1, 17)>
Public movement_type as Short

''' <summary>
''' 
''' </summary>
<TagField("", 2, -1)>
Public padding_1 as Byte()

''' <summary>
''' actors that start their movement try to maintain this fraction of crouched actors
''' </summary>
<TagField("initial crouch chance:[0,1]", 1, 0)>
Public initial_crouch_chance as Single

''' <summary>
''' when switching movement types, how long we will stay crouched for before running
''' </summary>
<TagField("crouch time:seconds", 2, 1)>
Public crouch_time as Single()

''' <summary>
''' when switching movement types, how long we will run for before slowing to a crouch
''' </summary>
<TagField("run time:seconds", 2, 1)>
Public run_time as Single()

''' <summary>
''' 
''' </summary>
#End Region
#Region "ranged combat"

''' <summary>
''' 
''' </summary>
<TagField("weapon", 16, 10)>
Public weapon as New TAG_REFERENCE

''' <summary>
''' we can only fire our weapon at targets within this distance
''' </summary>
<TagField("maximum firing distance:world units", 1, 0)>
Public maximum_firing_distance as Single

''' <summary>
''' how many times per second we pull the trigger (zero = continuously held down)
''' </summary>
<TagField("rate of fire", 1, 0)>
Public rate_of_fire as Single

''' <summary>
''' error added to every projectile we fire
''' </summary>
<TagField("projectile error:degrees", 1, 0)>
Public projectile_error as Single

''' <summary>
''' 
''' </summary>
<TagField("first burst delay time:seconds", 2, 1)>
Public first_burst_delay_time as Single()

''' <summary>
''' 
''' </summary>
<TagField("new-target firing pattern time:seconds", 1, 0)>
Public _new as Single

''' <summary>
''' 
''' </summary>
<TagField("surprise delay time:seconds", 1, 0)>
Public surprise_delay_time as Single

''' <summary>
''' 
''' </summary>
<TagField("surprise fire-wildly time:seconds", 1, 0)>
Public surprise_fire as Single

''' <summary>
''' 
''' </summary>
<TagField("death fire-wildly chance:[0,1]", 1, 0)>
Public death_fire as Single

''' <summary>
''' 
''' </summary>
<TagField("death fire-wildly time:seconds", 1, 0)>
Public death_fire_1 as Single

''' <summary>
''' 
''' </summary>
<TagField("desired combat range:world units", 2, 1)>
Public desired_combat_range as Single()

''' <summary>
''' custom standing gun offset for overriding the default in the base actor
''' </summary>
<TagField("custom stand gun offset", 3, 2)>
Public custom_stand_gun_offset as Single()

''' <summary>
''' custom crouching gun offset for overriding the default in the base actor
''' </summary>
<TagField("custom crouch gun offset", 3, 2)>
Public custom_crouch_gun_offset as Single()

''' <summary>
''' how well our bursts track moving targets. 0.0= fire at the position they were standing when we started the burst. 1.0= fire at current position
''' </summary>
<TagField("target tracking:[0,1]", 1, 0)>
Public target_tracking as Single

''' <summary>
''' how much we lead moving targets. 0.0= no prediction. 1.0= predict completely.
''' </summary>
<TagField("target leading:[0,1]", 1, 0)>
Public target_leading as Single

''' <summary>
''' what fraction of its normal damage our weapon inflicts (zero = no modifier)
''' </summary>
<TagField("weapon damage modifier", 1, 0)>
Public weapon_damage_modifier as Single

''' <summary>
''' only used if weapon damage modifier is zero... how much damage we should deliver to the target per second while firing a burst at them (zero = use weapon default)
''' </summary>
<TagField("damage per second", 1, 0)>
Public damage_per_second as Single

''' <summary>
''' at the start of every burst we pick a random point near the target to fire at, on either the left or the right side.
''' the burst origin angle controls whether this error is exactly horizontal or might have some vertica
''' </summary>
#End Region
#Region "burst geometry"

''' <summary>
''' how far away from the target the starting point is
''' </summary>
<TagField("burst origin radius:world units", 1, 0)>
Public burst_origin_radius as Single

''' <summary>
''' the range from the horizontal that our starting error can be
''' </summary>
<TagField("burst origin angle:degrees", 1, 0)>
Public burst_origin_angle as Single

''' <summary>
''' how far the burst point moves back towards the target (could be negative)
''' </summary>
<TagField("burst return length:world units", 2, 1)>
Public burst_return_length as Single()

''' <summary>
''' the range from the horizontal that the return direction can be
''' </summary>
<TagField("burst return angle:degrees", 1, 0)>
Public burst_return_angle as Single

''' <summary>
''' how long each burst we fire is
''' </summary>
<TagField("burst duration:seconds", 2, 1)>
Public burst_duration as Single()

''' <summary>
''' how long we wait between bursts
''' </summary>
<TagField("burst separation:seconds", 2, 1)>
Public burst_separation as Single()

''' <summary>
''' the maximum rate at which we can sweep our fire (zero = unlimited)
''' </summary>
<TagField("burst angular velocity:degrees per second", 1, 0)>
Public burst_angular_velocity as Single

''' <summary>
''' 
''' </summary>
<TagField("", 4, -1)>
Public padding_2 as Byte()

''' <summary>
''' damage modifier for special weapon fire (applied in addition to the normal damage modifier. zero = no change)
''' </summary>
<TagField("special damage modifier:[0,1]", 1, 0)>
Public special_damage_modifier as Single

''' <summary>
''' projectile error angle for special weapon fire (applied in addition to the normal error)
''' </summary>
<TagField("special projectile error:degrees", 1, 0)>
Public special_projectile_error as Single

''' <summary>
''' a firing pattern lets you modify the properties of an actor's burst geometry. actors choose which firing pattern to use based on their current state:
'''      'new-target' when the
''' </summary>
#End Region
#Region "firing patterns"

''' <summary>
''' burst duration multiplier for newly appeared targets (zero = unchanged)
''' </summary>
<TagField("new-target burst duration", 1, 0)>
Public _new_1 as Single

''' <summary>
''' burst separation multiplier for newly appeared targets (zero = unchanged)
''' </summary>
<TagField("new-target burst separation", 1, 0)>
Public _new_2 as Single

''' <summary>
''' rate-of-fire multiplier for newly appeared targets (zero = unchanged)
''' </summary>
<TagField("new-target rate of fire", 1, 0)>
Public _new_3 as Single

''' <summary>
''' error multiplier for newly appeared targets (zero = unchanged)
''' </summary>
<TagField("new-target projectile error", 1, 0)>
Public _new_4 as Single

''' <summary>
''' 
''' </summary>
<TagField("", 8, -1)>
Public padding_3 as Byte()

''' <summary>
''' burst duration multiplier when the actor is moving (zero = unchanged)
''' </summary>
<TagField("moving burst duration", 1, 0)>
Public moving_burst_duration as Single

''' <summary>
''' burst separation multiplier when the actor is moving (zero = unchanged)
''' </summary>
<TagField("moving burst separation", 1, 0)>
Public moving_burst_separation as Single

''' <summary>
''' rate-of-fire multiplier when the actor is moving (zero = unchanged)
''' </summary>
<TagField("moving rate of fire", 1, 0)>
Public moving_rate_of_fire as Single

''' <summary>
''' error multiplier when the actor is moving (zero = unchanged)
''' </summary>
<TagField("moving projectile error", 1, 0)>
Public moving_projectile_error as Single

''' <summary>
''' 
''' </summary>
<TagField("", 8, -1)>
Public padding_4 as Byte()

''' <summary>
''' burst duration multiplier when the actor is berserk (zero = unchanged)
''' </summary>
<TagField("berserk burst duration", 1, 0)>
Public berserk_burst_duration as Single

''' <summary>
''' burst separation multiplier when the actor is berserk (zero = unchanged)
''' </summary>
<TagField("berserk burst separation", 1, 0)>
Public berserk_burst_separation as Single

''' <summary>
''' rate-of-fire multiplier when the actor is berserk (zero = unchanged)
''' </summary>
<TagField("berserk rate of fire", 1, 0)>
Public berserk_rate_of_fire as Single

''' <summary>
''' error multiplier when the actor is berserk (zero = unchanged)
''' </summary>
<TagField("berserk projectile error", 1, 0)>
Public berserk_projectile_error as Single

''' <summary>
''' 
''' </summary>
<TagField("", 8, -1)>
Public padding_5 as Byte()

''' <summary>
''' 
''' </summary>
#End Region
#Region "special-case firing properties"

''' <summary>
''' we try to aim our shots super-ballistically if target is outside this range (zero = never)
''' </summary>
<TagField("super-ballistic range", 1, 0)>
Public super as Single

''' <summary>
''' we offset our burst targets randomly by this range when firing at non-visible enemies (zero = never)
''' </summary>
<TagField("bombardment range", 1, 0)>
Public bombardment_range as Single

''' <summary>
''' any custom vision range that this actor variant has (zero = normal)
''' </summary>
<TagField("modified vision range", 1, 0)>
Public modified_vision_range as Single

''' <summary>
''' the type of special weapon fire that we can use
''' </summary>
<TagField("special-fire mode", 1, 17)>
Public special_1 as Short

''' <summary>
''' when we will decide to use our special weapon fire mode
''' </summary>
<TagField("special-fire situation", 1, 17)>
Public special_2 as Short

''' <summary>
''' how likely we are to use our special weapon fire mode
''' </summary>
<TagField("special-fire chance:[0,1]", 1, 0)>
Public special_3 as Single

''' <summary>
''' how long we must wait between uses of our special weapon fire mode
''' </summary>
<TagField("special-fire delay:seconds", 1, 0)>
Public special_4 as Single

''' <summary>
''' 
''' </summary>
#End Region
#Region "berserking and melee"

''' <summary>
''' how close an enemy target must get before triggering a melee charge
''' </summary>
<TagField("melee range:world units", 1, 0)>
Public melee_range as Single

''' <summary>
''' if our target gets this far away from us, we stop trying to melee them
''' </summary>
<TagField("melee abort range:world units", 1, 0)>
Public melee_abort_range as Single

''' <summary>
''' if we are outside maximum range, we advance towards target, stopping when we reach minimum range
''' </summary>
<TagField("berserk firing ranges:world units", 2, 1)>
Public berserk_firing_ranges as Single()

''' <summary>
''' while berserking, how close an enemy target must get before triggering a melee charge
''' </summary>
<TagField("berserk melee range:world units", 1, 0)>
Public berserk_melee_range as Single

''' <summary>
''' while berserking, if our target gets this far away from us, we stop trying to melee them
''' </summary>
<TagField("berserk melee abort range:world units", 1, 0)>
Public berserk_melee_abort_range as Single

''' <summary>
''' 
''' </summary>
<TagField("", 8, -1)>
Public padding_6 as Byte()

''' <summary>
''' 
''' </summary>
#End Region
#Region "grenades"

''' <summary>
''' type of grenades that we throw
''' </summary>
<TagField("grenade type", 1, 17)>
Public grenade_type as Short

''' <summary>
''' how we throw our grenades
''' </summary>
<TagField("trajectory type", 1, 17)>
Public trajectory_type as Short

''' <summary>
''' what causes us to consider throwing a grenade
''' </summary>
<TagField("grenade stimulus", 1, 17)>
Public grenade_stimulus as Short

''' <summary>
''' how many enemies must be within the radius of the grenade before we will consider throwing there
''' </summary>
<TagField("minimum enemy count", 1, 23)>
Public minimum_enemy_count as Short

''' <summary>
''' we consider enemies within this radius when determining where to throw
''' </summary>
<TagField("enemy radius:world units", 1, 0)>
Public enemy_radius as Single

''' <summary>
''' 
''' </summary>
<TagField("", 4, -1)>
Public padding_7 as Byte()

''' <summary>
''' how fast we can throw our grenades
''' </summary>
<TagField("grenade velocity:world units per second", 1, 0)>
Public grenade_velocity as Single

''' <summary>
''' ranges within which we will consider throwing a grenade
''' </summary>
<TagField("grenade ranges:world units", 2, 1)>
Public grenade_ranges as Single()

''' <summary>
''' we won't throw if there are friendlies around our target within this range
''' </summary>
<TagField("collateral damage radius:world units", 1, 0)>
Public collateral_damage_radius as Single

''' <summary>
''' how likely we are to throw a grenade
''' </summary>
<TagField("grenade chance:[0,1]", 1, 0)>
Public grenade_chance as Single

''' <summary>
''' for continuous stimuli (e.g. visible target), how often we check to see if we want to throw a grenade
''' </summary>
<TagField("grenade check time:seconds", 1, 0)>
Public grenade_check_time as Single

''' <summary>
''' we cannot throw grenades if someone else in our encounter threw one this recently
''' </summary>
<TagField("encounter grenade timeout:seconds", 1, 0)>
Public encounter_grenade_timeout as Single

''' <summary>
''' 
''' </summary>
<TagField("", 20, -1)>
Public padding_8 as Byte()

''' <summary>
''' 
''' </summary>
#End Region
#Region "items"

''' <summary>
''' equipment item to drop when we die
''' </summary>
<TagField("equipment", 16, 10)>
Public equipment as New TAG_REFERENCE

''' <summary>
''' number of grenades that we start with
''' </summary>
<TagField("grenade count", 2, 24)>
Public grenade_count as Short()

''' <summary>
''' how likely we are not to drop any grenades when we die, even if we still have some
''' </summary>
<TagField("dont drop grenades chance:[0,1]", 1, 0)>
Public dont_drop_grenades_chance as Single

''' <summary>
''' amount of ammo loaded into the weapon that we drop (in fractions of a clip, e.g. 0.3 to 0.5)
''' </summary>
<TagField("drop weapon loaded", 2, 1)>
Public drop_weapon_loaded as Single()

''' <summary>
''' total number of rounds in the weapon that we drop (ignored for energy weapons)
''' </summary>
<TagField("drop weapon ammo", 2, 24)>
Public drop_weapon_ammo as Short()

''' <summary>
''' 
''' </summary>
<TagField("", 12, -1)>
Public padding_9 as Byte()

''' <summary>
''' 
''' </summary>
<TagField("", 16, -1)>
Public padding_10 as Byte()

''' <summary>
''' 
''' </summary>
#End Region
#Region "unit"

''' <summary>
''' maximum body vitality of our unit
''' </summary>
<TagField("body vitality", 1, 0)>
Public body_vitality as Single

''' <summary>
''' maximum shield vitality of our unit
''' </summary>
<TagField("shield vitality", 1, 0)>
Public shield_vitality as Single

''' <summary>
''' how far away we can drain the player's shields
''' </summary>
<TagField("shield sapping radius:world units", 1, 0)>
Public shield_sapping_radius as Single

''' <summary>
''' if nonzero, overrides the unit's shader permutation
''' </summary>
<TagField("forced shader permutation", 1, 23)>
Public forced_shader_permutation as Short

''' <summary>
''' 
''' </summary>
<TagField("", 2, -1)>
Public padding_11 as Byte()

''' <summary>
''' 
''' </summary>
<TagField("", 16, -1)>
Public padding_12 as Byte()

''' <summary>
''' 
''' </summary>
<TagField("", 12, -1)>
Public padding_13 as Byte()

''' <summary>
''' actor_variant_change_colors_block
''' </summary>
<TagField("change colors", 32, 11)>
Public change_colors as List(Of CHANGE_COLORS_BLOCK)
#End Region
Public Class CHANGE_COLORS_BLOCK

''' <summary>
''' 
''' </summary>
<TagField("color lower bound", 3, 2)>
Public color_lower_bound as Single()

''' <summary>
''' 
''' </summary>
<TagField("color upper bound", 3, 2)>
Public color_upper_bound as Single()

''' <summary>
''' 
''' </summary>
<TagField("", 8, -1)>
Public padding as Byte()

End Class

End Class
